package ru.smc.hogwarts.servlets.students;

import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.servlet.RequestDispatcher;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import ru.smc.hogwarts.classes.EMF;
import ru.smc.hogwarts.model.Person;
import ru.smc.hogwarts.model.Student;

public class StudentsEdit extends HttpServlet implements Servlet {
	private static final long serialVersionUID = 1L;
	private String error = "";
	private String firstName = null;
	private String lastName = null;
	private int year = 0;
	private String status = null;
	private Date begin = null;
	private Date end = null;
	private HttpSession session;
	
    public StudentsEdit() {
        super();
    }
    
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		long id = 0;
		request.setAttribute("error", error);
		
		session = request.getSession(true);
    	session.setAttribute("servletName", getServletName());
		
		try {
			id = Long.parseLong(request.getParameter("id"));
		} catch(NumberFormatException e) {}
		
		EntityManagerFactory emf = EMF.getInstance().getEMF();
    	EntityManager em = emf.createEntityManager();
		
		Student student = em.find(Student.class, id);
		
		if (student == null) {
			request.getRequestDispatcher("/pages/error/error.jsp").forward(request, response);
		} else {		
			List<Integer> dd = new ArrayList<Integer>();
			for (int i = 1; i<=31; i++) { dd.add(i); }
			request.setAttribute("dd", dd);			
			
			List<Integer> yyyy = new ArrayList<Integer>();
			for (int i = 2000; i<=2020; i++) { yyyy.add(i); }
			request.setAttribute("yyyy", yyyy);
	
			if (error == "") {
				Person person = student.getPerson();
				
				request.setAttribute("firstName", person.getFirstName());
				request.setAttribute("lastName", person.getLastName());
				request.setAttribute("year", student.getYear());
				request.setAttribute("status", student.getStatus());
				request.setAttribute("begin", student.getBegin());
				request.setAttribute("end", student.getEnd());
				
			} else if (error != "") {
				request.setAttribute("firstName", firstName);
				request.setAttribute("lastName", lastName);
				request.setAttribute("year", year);
				request.setAttribute("status", status);
				request.setAttribute("begin", begin);
				request.setAttribute("end", end);
			}
			
			request.setAttribute("id", id);
							
			error = "";
			RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/pages/students/studentEdit.jsp");
			dispatcher.forward(request, response);
		}

		em.close();
	}
	
	@SuppressWarnings("deprecation")
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		error = "";
		DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		int id = 0;
		
		try {
			try {
				id = Integer.parseInt(request.getParameter("id"));
			} catch(NumberFormatException e) {}
			
			firstName = request.getParameter("firstName");
			if (firstName == "") error += "<span>П</span>оле \"Имя\" не должно быть пустым.<br>";
						
			lastName = request.getParameter("lastName");
			if (lastName == "") error += "<span>П</span>оле \"Фамилия\" не должно быть пустым.<br>";
			
			try {
				year = Integer.parseInt(request.getParameter("year"));
			} catch(NumberFormatException e) {}
			if (request.getParameter("year") == "") error += "<span>П</span>оле \"Курс\" не должно быть пустым.<br>";
			
			status = request.getParameter("status");
			if (status == "") error += "<span>П</span>оле \"Статус\" не должно быть пустым.<br>";
			
			if ((request.getParameter("beginDD") != "") && (request.getParameter("beginMM") != "") && (request.getParameter("beginYYYY") != "")) {
				begin = df.parse(request.getParameter("beginYYYY")+"-"+request.getParameter("beginMM")+"-"+request.getParameter("beginDD"));
				if (begin.getMonth()+1 != Integer.parseInt(request.getParameter("beginMM"))) 
					error += "<span>З</span>начение поля \"Дата зачисления\" введено некорректно. Такой даты не существует.<br>";
			} else if (request.getParameter("beginDD") == "") {
				error += "<span>З</span>начение поля \"Дата зачисления\" введено некорректно. День не должен быть пустым.<br>";
			} else if (request.getParameter("beginMM") == "") {
				error += "<span>З</span>начение поля \"Дата зачисления\" введено некорректно. Месяц не должен быть пустым.<br>";
			} else if (request.getParameter("beginYYYY") == "") {
				error += "<span>З</span>начение поля \"Дата зачисления\" введено некорректно. Год не должен быть пустым.<br>";
			}
			
			if ((request.getParameter("endDD") != "") && (request.getParameter("endMM") != "") && (request.getParameter("endYYYY") != "")) {
				end = df.parse(request.getParameter("endYYYY")+"-"+request.getParameter("endMM")+"-"+request.getParameter("endDD"));
				if (end.getMonth()+1 != Integer.parseInt(request.getParameter("endMM"))) 
					error += "<span>З</span>начение поля \"Дата окончания\" введено некорректно. Такой даты не существует.<br>";
			} else if (request.getParameter("endDD") == "") {
				error += "<span>З</span>начение поля \"Дата окончания\" введено некорректно. День не должен быть пустым.<br>";
			} else if (request.getParameter("endMM") == "") {
				error += "<span>З</span>начение поля \"Дата окончания\" введено некорректно. Месяц не должен быть пустым.<br>";
			}  else if (request.getParameter("endYYYY") == "") {
				error += "<span>З</span>начение поля \"Дата окончания\" введено некорректно. Год не должен быть пустым.<br>";
			}
			
			if (begin != null && end != null && end.before(begin)) {
				error += "<span>З</span>начение поля \"Дата окончания\" не может быть меньше значения поля \"Дата зачисления\".<br>";
			}
		} catch(Exception e) {
			e.printStackTrace();
		}
		
		if (error == "") { 
			this.updateStudent(id, firstName, lastName, begin, end, year, status);
			response.sendRedirect(request.getContextPath() + "/students");
		} else if (error != "") {
			response.sendRedirect(request.getContextPath() + "/students/edit?id="+id);
		}
	}
	
	public void updateStudent(int editorId, String firstName, 
			String lastName, Date begin, Date end, int year, String status) {
		EntityManagerFactory emf = EMF.getInstance().getEMF();
    	EntityManager em = emf.createEntityManager();
		
		em.getTransaction().begin();
		Student student = em.find(Student.class, editorId);
		Person person = student.getPerson();
		person.setFirstName(firstName);
		person.setLastName(lastName);
			
		student.setBegin(begin);
		student.setEnd(end);
		student.setYear(year);
		student.setStatus(status);
		em.getTransaction().commit();
		
		em.close();
	}
}
